package org.me.client;

public class AnalisierteFunktion implements OOPFunktion {
	private String rAusdruck;

	private Variable[] variablen;

	private Variable[] konstante;

	RecursiveDescentParser parser;

	/**
	 * @param rAusdruck
	 */
	public AnalisierteFunktion(String rAusdruck) {
		this.rAusdruck = rAusdruck;
		this.parser=new RecursiveDescentParser(rAusdruck);
	}

	/**
	 * @param rAusdruck
	 * @param variablen
	 */
	public AnalisierteFunktion(String rAusdruck, Variable[] variablen) {
		this.rAusdruck = rAusdruck;
		this.variablen = variablen;
		parser = new RecursiveDescentParser(rAusdruck);
		parser.setVariable(variablen);
	}

	public AnalisierteFunktion(String rAusdruck, Variable[] variablen,Variable[] konstante) {
		this.rAusdruck = rAusdruck;
		this.variablen = variablen;
		this.konstante = konstante;
		parser = new RecursiveDescentParser(rAusdruck);
		parser.setVariable(variablen);
		parser.setKonstante(konstante);
	}

	public Number abzuschaetzen(Variable[] X) {
		parser.setVariable(X);
		return new Double(parser.eval());
	}

	public Number abzuschaetzen(){
		if(parser==parser){
			return new Double(parser.eval());
		}
		return null;
	}

	public Number abzuschaetzen(VariablenReihe X) {
		parser.setVariable(X);
		return new Double(parser.eval());
	}

	/**
	 * @return the rAusdruck
	 */
	public String getRAusdruck() {
		return rAusdruck;
	}

	/**
	 * @return the variablen
	 */
	public Variable[] getVariable() {
		return variablen;
	}

	/**
	 * @param variablen
	 *            The variablen to set.
	 */
	private void setVariable(Variable[] variablen) {
		this.variablen = variablen;
	}

	/**
	 * @return the konstante
	 */
	public Variable[] getKonstante() {
		return konstante;
	}

	/**
	 * @param konstante the konstante to set
	 */
	private void setKonstante(Variable[] konstante) {
		this.konstante = konstante;
	}
}
